from src.domain.distribution import SharesDistribution
from src.domain.share_type import Cap, Term, Region, ShareType
TOTAL = 1
distribution = SharesDistribution(
# by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.75, 0.25))),
# by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
# by_cap=dict(zip((Cap.Large, Cap.Small), (0.8, 0.2))),
# by_term=dict(zip((Term.Long, ), (1, ))),
by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.6, 0.4))),
by_region=dict(zip((Region.US, Region.ExUS), (1., 0.))),
by_cap=dict(zip((Cap.Large, Cap.Small), (0.8, 0.2))),
by_term=dict(zip((Term.Long, Term.Short), (0.5, 0.5))),
)
large_us_stocks = {
# "VTI": 0.8,
# "VNQ (REIT)": 0.2
"VTI": 0.5,
"GLD": 0.5
}
large_exus_stocks = {
"EAFE": 1
}
small_us_stocks = {
"Russell 2000": 1
}
small_exus_stocks = {
"EAFE Small-Cap": 1
}
bonds = {
"BND": 1,
"SHY": 1
}
def assert_shares(obj):
assert sum(obj.values()) == TOTAL
fund_shares = [large_us_stocks, large_exus_stocks, small_us_stocks, small_exus_stocks, bonds]
for shares in [distribution.by_cap, distribution.by_region, distribution.by_term, distribution.by_type] + fund_shares:
assert_shares(shares)
###
flatten_stock_portfolio = []
stock_share = distribution.by_type[ShareType.Stock]
for (region_key, region_value) in distribution.by_region.items():
for (cap_key, cap_value) in distribution.by_cap.items():
flatten_stock_portfolio.append({
"region": region_key.value,
"share": stock_share * region_value * cap_value,
"cap": cap_key.value
})
def sort_by_share(portfolio):
return sorted(portfolio, key=lambda x: x["share"], reverse=True)
flatten_stock_portfolio = sort_by_share(flatten_stock_portfolio)